package com.hotelsystem.config;

import com.hotelsystem.realm.EmpRealm;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.servlet.Filter;
import java.util.LinkedHashMap;
import java.util.Map;


@Configuration //申明为配置类
public class ShiroConfiguration {

    //依赖三个对象
    /**Qualifier("defaultWebSecurityManager") defaultWebSecurityManager
     * 创建ShiroFilterFactoryBean
     */
    @Bean(name = "shiroFilterFactoryBean")
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("defaultWebSecurityManager") DefaultWebSecurityManager securityManager){
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        //设置安全管理器
        shiroFilterFactoryBean.setSecurityManager(securityManager);

        Map<String, Filter> filtersMap = new LinkedHashMap<>();

        filtersMap.put("permissionFilter",new EmpAuthorzationFilter());//可以配置RoleOrFilter的Bean

        //filtersMap.put("logout",new SystemLogoutFilter()); //退出shiro清除会话


        shiroFilterFactoryBean.setFilters(filtersMap);
        //添加shiro内置过滤器
        /**
         * shiro内置过滤器，可以实现权限相关的拦截器
         *     常用的过滤器：
         *          anon:无需认证（登录）可以访问
         *          authc:必须认证才可以访问
         *          user:如果使用rememberMe的功能可以直接访问
         *          perms:该资源必须得到资源权限才可以访问
         *          role:该资源必须得到角色权限才可以访问
         */
        Map<String,String> fileterMap = new LinkedHashMap<>();
        /*********************************设置放行请求******************************/
        //登录页面
        fileterMap.put("/","anon");
        //登录请求
        fileterMap.put("/employee/emp_login","anon");

        //fileterMap.put("permissionFilter",new EmpAuthorzationFilter());

        /********************************* 授权过滤器***********************************/
        //注意：当前授权拦截后，shiro会自动跳转到未授权页面
        //只有管理员 和 超级管理员有权看员工信息  1,2，3 分别是 超级管理员  管理员 普通员
        /*** 只允许管理员 和    超级管理员进来  **/
        //这里有问题  emp:supper 超级管理员 emp:admin 管理员
        //人员管理
        fileterMap.put("/employee/toEmployee","permissionFilter[emp:admin|emp:supper]"); //只能1 或 2 进来
        //账单
        fileterMap.put("/finance/toFinance","permissionFilter[emp:admin|emp:supper]");
        //日志
        fileterMap.put("/logging/toLogging","permissionFilter[emp:supper]");


        /*-----------------所有的请求，必须经过身份验证 拦截 ----------------*/
        //拦截主页
        fileterMap.put("/main.*","authc");
        //拦截客户
        fileterMap.put("/customer/**","authc");
        //拦截员工
        fileterMap.put("/employee/**","authc");
        //拦截报表
        fileterMap.put("/finance/**","authc");
        //拦截日志
        fileterMap.put("/logging/**","authc");
        //拦截订单
        fileterMap.put("/orders/**","authc");
        //拦截客房管理
        fileterMap.put("/room/**","authc");
        //拦截类型
        fileterMap.put("/roomType/**","authc");
        fileterMap.put("/logout","logout");



        //修改调整的登录页面
        shiroFilterFactoryBean.setLoginUrl("/");
        //设置未授权提示页面
        shiroFilterFactoryBean.setUnauthorizedUrl("/noAuth.html");


        shiroFilterFactoryBean.setFilterChainDefinitionMap(fileterMap);
        return  shiroFilterFactoryBean;
    }



    /**
     * 创建DefaultWebSecurityManager
     */
    @Bean(name = "defaultWebSecurityManager")
    public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("empRealm") EmpRealm empRealm){
        DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
        defaultWebSecurityManager.setRealm(empRealm);
        return  defaultWebSecurityManager;
    }

    /**
     * 创建Realm对象
     */
    @Bean(name = "empRealm")
    public EmpRealm getEmpRealm(){
        return  new EmpRealm();
    }



}
